﻿using Application_Core.Dispatcher_Component.Access_Layer;
using Application_Core.Dispatcher_Component.Access_Layer.Implementations;
using System;
using System.Collections.Generic;

namespace Client.Client_Component
{
    internal class BauteilServiceImpl : BauteilService
    {
        public TimeSpan FertigeBauteil(BauteilDTO bauteilDTO)
        {
            DispatcherForClientService service = new DispatcherComponentFacade();
            Object bauteilDTOObj = service.RequestInvokeMethod("FertigeBauteil", "BauteilService",
                new Type[] { typeof(BauteilDTO) }, new Object[] { bauteilDTO });
            if (bauteilDTOObj.GetType() == typeof(TimeSpan))
            {
                return (TimeSpan)bauteilDTOObj;
            }
            throw new WrongReturningTypeException("Der erhaltene Typ entspricht " + bauteilDTOObj.GetType() + ", es wird jedoch der Typ BauteilDTO erwartet.");
        }

        public void CreateBauteil(BauteilDTO bauteilDTO)
        {
            DispatcherForClientService service = new DispatcherComponentFacade();
            service.RequestInvokeMethod("CreateBauteil", "BauteilService", new Type[] { typeof(BauteilDTO) }, new Object[] { bauteilDTO });
        }

        public void CreateStückliste(StücklisteDTO stückliste, List<StücklistenPositionDTO> positionen)
        {
            DispatcherForClientService service = new DispatcherComponentFacade();
            service.RequestInvokeMethod("CreateStückliste", "BauteilService", new Type[] { typeof(StücklisteDTO), typeof(List<StücklistenPositionDTO>) },
                new Object[] { stückliste, positionen });
        }

        public BauteilDTO FindBauteil(int nummer)
        {
            DispatcherForClientService service = new DispatcherComponentFacade();
            Object bauteilDTOObj = service.RequestInvokeMethod("FindBauteil", "BauteilService",
                new Type[] { typeof(Int32) }, new Object[] { nummer });
            if (bauteilDTOObj == null) {
                return null;
            }
            else if (bauteilDTOObj.GetType() == typeof(BauteilDTO))
            {
                return (BauteilDTO)bauteilDTOObj;
            }
            throw new WrongReturningTypeException("Der erhaltene Typ entspricht " + bauteilDTOObj.GetType() + ", es wird jedoch der Typ BauteilDTO oder 'null' erwartet.");
        }

        public List<BauteilDTO> FindBauteile(string name)
        {
            DispatcherForClientService service = new DispatcherComponentFacade();
            Object bauteilDTOListObj = service.RequestInvokeMethod("FindBauteile", "BauteilService",
                new Type[] { typeof(String) }, new Object[] { name });
            if (bauteilDTOListObj.GetType() == typeof(List<BauteilDTO>))
            {
                return (List<BauteilDTO>)bauteilDTOListObj;
            }
            throw new WrongReturningTypeException("Der erhaltene Typ entspricht " + bauteilDTOListObj.GetType() + ", es wird jedoch der Typ List<BauteilDTO> erwartet.");
        }

        public void DeleteBauteil(int nummer)
        {
            DispatcherForClientService service = new DispatcherComponentFacade();
            service.RequestInvokeMethod("DeleteBauteil", "BauteilService", new Type[] { typeof(Int32) }, new Object[] { nummer });
        }
    }
}
